/*
 *MetadataDiffusion
Copyright (C) Olivier Motelet.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
package diffuse.util.fibheapMax;

import java.util.HashMap;
import java.util.Map;

/**
 * This class extends FibHeap in such manner than inserting a element already existing correspong to a decrease
 * 
 * @author omotelet
 *
 */


public class FibHeapWithIncreasingInsert<T extends DynamicSetElement> extends FibonacciHeap<T>{

	
	Map<T, FibonacciHeapNode<T>> itsMap = new HashMap<T, FibonacciHeapNode<T>>();
	
	
	
	public FibHeapWithIncreasingInsert() {
		super();
	}
	
	
	@Override
	public FibonacciHeapNode<T> removeMax() {
		FibonacciHeapNode<T> theMaxElement =  super.removeMax();
		itsMap.remove(theMaxElement);
		return theMaxElement;
	}
	
	
	/**
	 * 
	 */
	
	public void insert(T aE) {
		if (itsMap.containsKey(aE)){
			FibonacciHeapNode<T> theNode = itsMap.get(aE);
			increaseKey(theNode, aE.getKey());	
			//System.out.println("I decreased"+ aE);
			return;
		}
		FibonacciHeapNode<T> theNode = new FibonacciHeapNode<T>(aE,aE.getKey());
		super.insert(theNode,aE.getKey());
		itsMap.put(aE, theNode);
	}
	
	
}
